package com.maoatao.easycodegen.toolkit;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * 泛型类型解析工具类
 * 提供获取类泛型参数类型的功能
 *
 * @author MaoAtao
 * @date 2025-10-04
 */
public class GenericTypeUtil {

    /**
     * 获取类的泛型参数类型
     *
     * @param clazz 需要获取泛型参数的类
     * @return 泛型参数类型，如果无法获取则返回Object.class
     */
    public static Class<?>[] getGenericClass(Class<?> clazz) {
        // 获取当前类的泛型超类
        Type genericSuperclass = clazz.getGenericSuperclass();
        if (genericSuperclass instanceof ParameterizedType parameterizedType) {
            Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
            if (actualTypeArguments.length > 0) {
                // 正确地将Type数组转换为Class数组
                Class<?>[] classArray = new Class<?>[actualTypeArguments.length];
                for (int i = 0; i < actualTypeArguments.length; i++) {
                    if (actualTypeArguments[i] instanceof Class) {
                        classArray[i] = (Class<?>) actualTypeArguments[i];
                    } else {
                        // 如果不是Class类型，默认使用Object.class
                        classArray[i] = Object.class;
                    }
                }
                return classArray;
            }
        }
        return null;
    }

    /**
     * 获取类的第一个泛型参数类型
     *
     * @param clazz 需要获取泛型参数的类
     * @return 泛型参数类型，如果无法获取则返回Object.class
     */
    public static Class<?> getFirstGenericClass(Class<?> clazz) {
        Class<?>[] genericClass = getGenericClass(clazz);

        if (genericClass != null && genericClass.length > 0) {
            return genericClass[0];
        }
        // 如果无法获取泛型类型，则返回Object.class
        return Object.class;
    }
}
